/**
 * 用原生js以及promise封装的ajax
 * @param options
 * url:请求地址，默认值是空字符串
 * method:请求方式get和post两种，默认get
 * async:true是异步，flase是同步，默认异步
 * data:请求参数，默认{}
 * reqHeader:设置头信息，默认{}
 * responseType:响应服务器的数据类型(responseText、responseXML)，默认responseText
 * timeout:等待时间，默认5000
 *
 * 返回值是一个promise值
 */
function ajax(options){
    return new Promise((resolve,reject)=>{
        // 请求地址
        let url = options.url?options.url:''
        // 请求方式
        let method = options.method ? options.method : 'GET'
        method = method.toUpperCase()
        // 默认为异步true
        let async = options.async?options.async:true
        // 请求发送参数
        let data =  queryUrlParams(options.data)
        //设置头信息
        let reqHeader = options.setRequestHeader?options.setRequestHeader:{}
        //响应服务器的数据类型
        let responseType = options.responseType?options.responseType : 'responseText'
        //等待响应的时间
        let timeout = options.timeout?options.timeout:5000
        //实例化ajax对象 IE7+ Firefox, Chrome, Opera, Safari 浏览器执行代码
        let xhr = new XMLHttpRequest()

        //提取发送数据方法
        function queryUrlParams(urlParams){
            //判断是否是对象类型
            // if(Object.prototype.toString.call(urlParams) !== '[object Object]'){
            //     throw new TypeError('data must be of object type')
            // }
            let result = ''
            for(let key in urlParams){
                if(urlParams.hasOwnProperty(key)){
                    result +=key + '=' + urlParams[key] + '&'
                }
            }
            return result.slice(0,result.length-1)
        }

        //设置RequestHeader方法
        function setRequestHeader(_xhr,_reqHeader){
            for(let [key,value] of Object.entries(_reqHeader)){
                _xhr.setRequestHeader(key,value)
            }
        }

        //处理GET请求方式的请求发送参数
        if(method === 'GET'){
            //检测url中是否有?
            const index = url.indexOf('?')
            if(index === -1){
                url += '?'
            }else if(index !== url.length -1 && data.length>0){
                url += '&'
            }
            //拼接url
            url += data
            xhr.open(method,url,async)
            xhr.send(null)
        }else if(method === 'POST'){
            xhr.open(method,url,async)
            setRequestHeader(xhr,reqHeader)
            xhr.send(data)
        }else{
            reject('TypeError method')
        }

        xhr.onreadystatechange = function(){
            let timer = null
            if( xhr.readyState === 4 && xhr.status === 200){
                if(responseType === 'responseText'){
                    clearTimeout(timer)
                    resolve(xhr.responseText)
                }else if(responseType === 'responseXML'){
                    resolve(xhr.responseText)
                }
                else{
                    reject('RangeError:responseType is not allowed to be '+responseType)
                }
            }
            timer = setTimeout(()=>{
                clearTimeout(timer)
                reject(xhr.status)
            },timeout)
        }
    })
}



